package controllers;

import gestioneDatabase.Post.PostsManager;
import gestioneDatabase.Post.ResponsesManager;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import controllersUtilities.ContentNormalizer;
import models.Post;
import models.User;
import utilities.GestoreLink;

/**
 * Controller per la visualizzazione di un singolo post
 * 
 */
@WebServlet("/viewpost")
public class ViewPostController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private ContentNormalizer normalizer = new ContentNormalizer();

	/**
	 * Mostra un singolo post identificato tramite l'ID (passato come parametro
	 * del GET). Se la pagina viene caricata senza parametri, viene mostrata la
	 * pagina di errore. Viene mostrato un errore anche nel caso l'ID non sia un
	 * numero valido (come ad esempio "f4l50")
	 */
	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		try {
			Integer idPostToShow = Integer.parseInt(request.getParameter("id"));
			Post postToShow = PostsManager.getManager().getPostByID(
					idPostToShow);
			String postContent = postToShow.getContent();

			postContent = normalizer.normalize(postContent);
			postToShow.setContent(postContent);
			for (Post resp : postToShow.getResponses()) {
				postContent = resp.getContent();
				postContent = normalizer.normalize(postContent);
				resp.setContent(postContent);
			}

			request.setAttribute("post", postToShow);
			request.getRequestDispatcher(
					GestoreLink.getGestore().getElement("ViewPost")).forward(
					request, response);
		} catch (NumberFormatException e) {
			System.err.println("L'ID richiesto non è un numero");
			System.err.println(e);
			request.getRequestDispatcher(
					GestoreLink.getGestore().getElement("GenericError"))
					.forward(request, response);
		} catch (Exception e) {
			request.getRequestDispatcher(
					GestoreLink.getGestore().getElement("GenericError"))
					.forward(request, response);
			System.err.println(e);
		}
	}
	
	/**
	 * Gestisce l'aggiunta di una risposta al post. Notare che postID e' un
	 * parametro passato dal form e identifica il post al quale aggiungere
	 * la risposta che e' appena stata scritta.
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		Integer postID = Integer.parseInt(request.getParameter("postID"));
		String responseContent = request.getParameter("response");
		User currentUser = (User) request.getSession().getAttribute("identity");
		Post responseToAdd = fillNewResponse(postID, responseContent,
				currentUser);
		ResponsesManager.getManager().addNewResponse(postID, responseToAdd);

		response.sendRedirect("/login-in-prestito/viewpost?id=" + postID);
	}

	private Post fillNewResponse(Integer postID, String responseContent,
			User currentUser) {
		Post responseToAdd = new Post(currentUser);
		responseToAdd.setId(postID);
		responseToAdd.setContent(responseContent);
		return responseToAdd;
	}

}
